﻿using Microsoft.Speech;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Speech.Synthesis;
using Microsoft.Speech.AudioFormat;
using Merger.Wav;
using System.Threading;
using Syntezator_mowy.Transmiter;
using Syntezator_mowy.Extras;
using Syntezator_mowy.SDDBD;
using System.IO;
using Microsoft.Speech.Recognition;

namespace Syntezator_mowy
{
    class Program
    {
      private Serwer bazaDanych;
        private string pathToLame;
        private SynchrBuffer<InputParameters> buforWejsciowy;
        private SynchrBuffer<string> przetworzonePliki;

        private FileTransmiter transmiter;
        private Kontroler kontroler;

        private Thread kontrolerThread;

        static void Main(string[] args)
        {
            Program program = new Program();

            string plik = @"C:\test\gdansk.wav";
            string ciagWejsciowy;
            using (BinaryReader reader = new BinaryReader(File.Open(plik,FileMode.Open)))
            {
                byte[] bufor = new byte[200];
                List<byte> daneWejsciowe = new List<byte>();
                long pos = 0;
                long len = reader.BaseStream.Length;

                while (pos < len)
                {
                    int iloscPobieranychBajtow = Math.Min(bufor.Length, (int)(len - pos));
                    reader.Read(bufor, 0, iloscPobieranychBajtow);
                    daneWejsciowe.AddRange(bufor);
                    pos += iloscPobieranychBajtow;
                }
                ciagWejsciowy = Convert.ToBase64String(daneWejsciowe.ToArray());
            }

            string daneWyjsciowe = program.przeksztalcNaTekst(ciagWejsciowy);
            System.Console.WriteLine("Dane wyjsciowe: " + daneWyjsciowe);

           /* foreach (RecognizerInfo ri in SpeechRecognitionEngine.InstalledRecognizers())
            {
                Console.WriteLine(ri.Culture);
            }
            Console.ReadKey();*/


            /*Serwer bazaDanych = new Serwer();

            string pathToLame = @"C:\Users\MM\Desktop\lame3.99.5\lame.exe";

            SynchrBuffer<InputParameters> buforWejsciowy = new SynchrBuffer<InputParameters>();
            SynchrBuffer<string> przetworzonePliki = new SynchrBuffer<string>();

            FileTransmiter transmiter = new FileTransmiter(ref buforWejsciowy);
            Thread transmiterThread = new Thread(new ThreadStart(transmiter.run));

            Kontroler kontroler = new Kontroler(ref buforWejsciowy, ref przetworzonePliki, bazaDanych);
            Thread kontrolerThread = new Thread(new ParameterizedThreadStart(kontroler.run));

            transmiterThread.Start();
            kontrolerThread.Start((object)pathToLame);

            transmiterThread.Join();
            kontroler.endAction = true;
            kontrolerThread.Join();*/


        }

        private Program()
        {
            this.bazaDanych = new Serwer();

            this.pathToLame = @"C:\inz\lame3.99.5\lame.exe";

            this.buforWejsciowy = new SynchrBuffer<InputParameters>();
            this.przetworzonePliki = new SynchrBuffer<string>();

            this.transmiter = new FileTransmiter(ref buforWejsciowy);

            this.kontroler = new Kontroler(ref buforWejsciowy, ref przetworzonePliki, bazaDanych);

            this.kontrolerThread = new Thread(new ParameterizedThreadStart(kontroler.run));
            this.kontrolerThread.Start((object)pathToLame);
        }

        public string przeksztalcNaTekst(string daneWejsciowe)
        {
           byte[] danePrzetworzone = System.Convert.FromBase64String(daneWejsciowe);

            // To do: utworz randomizowanaSciezke wejsciowa i wyjsciowa
            string sciezkaWejsciowa = @"C:\test\wejscie.wma";
            string sciezkaWyjsciowa = @"C:\test\wyjscie.txt";

            using (System.IO.BinaryWriter writer = new System.IO.BinaryWriter(System.IO.File.Create(sciezkaWejsciowa)))
            {
                writer.Write(danePrzetworzone);
            }

            InputParameters dane = new InputParameters(sciezkaWejsciowa, sciezkaWyjsciowa, Jezyk.POLSKI, Action.SP);

            Thread transmiterThread = new Thread(new ParameterizedThreadStart(transmiter.run));
            transmiterThread.Start((object)dane);

            while (!this.kontroler.przetworzono)
            {
                Thread.Sleep(100);
            }

            string daneWyjsciowe = "";
            using (System.IO.StreamReader reader = new System.IO.StreamReader(sciezkaWyjsciowa))
            {
                daneWyjsciowe = reader.ReadToEnd();
            }
            return daneWyjsciowe;
        }

    }
}
